package com.demo.listener;

import com.demo.bean.User;

import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import java.util.LinkedHashMap;
import java.util.Map;

/**
 * @author WuLiangHang
 */
@WebListener
public class UserListener implements HttpSessionAttributeListener {

    @Override
    public void attributeAdded(HttpSessionBindingEvent event) {
//        HashSet<E> == HashMap<K,null>
        //获取添加到Session中的name是否为"user"
        if (event.getName().equals("user")) {
            //获取在线名单
            Map<String, User> onlineUsers = (Map<String, User>) event.getSession().getServletContext().getAttribute("onlineUsers");
            //如果在线名单为空，也就意味着之前没有用户登录过
            if (onlineUsers == null) {
                onlineUsers = new LinkedHashMap<>();
            }
            //获取添加到session中的value 即登录的User对象
            User user = (User) event.getValue();
            //把用户保存到在线名单中
            onlineUsers.put(user.getName(), user);
            //把在线名单保存到ServletContext中
            event.getSession().setAttribute("onlineUsers", onlineUsers);
        }
    }

    @Override
    public void attributeReplaced(HttpSessionBindingEvent event) {
        //获取添加到session中的name是否为user
        if (event.getName().equals("user")) {
            //获取在线名单
            Map<String, User> onlineUsers = (Map<String, User>) event.getSession().getServletContext().getAttribute("onlineUsers");
            //如果在线名单为空，也就意味着之前没有用户登录过
            if (onlineUsers == null) {
                onlineUsers = new LinkedHashMap<>();
            }
            //因为是替换Session中的值时，才会调用本方法 所以替换就会有老值和新值
            //event.getValue()获取的是老值，即被替换的值
            //我们要把老值从在线名单中移除
            User user = (User) event.getValue();
            //从在线名单中移除老值，把上一个用户从session中踢出
            onlineUsers.remove(user.getName());
            //获取当前session中保存的新值
            user = (User) event.getSession().getAttribute("user");
            onlineUsers.put(user.getName(), user);
            //把在线名单保存到ServletContext中
            event.getSession().setAttribute("onlineUsers", onlineUsers);
        }
    }

    @Override
    public void attributeRemoved(HttpSessionBindingEvent event) {
        User user = (User) event.getValue();
        //获取在线名单
        Map<String, User> onlineUsers = (Map<String, User>) event.getSession().getServletContext().getAttribute("onlineUsers");
        //从在线名单中移除User
        if (onlineUsers != null) {
            onlineUsers.remove(user.getName());
        }
    }
}
